<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>throw表达式</title>
</head>
<body>
    <h1>throw表达式</h1>
    <h2>throw可以作为表达式使用</h2>

    <script>
        // 目前的写法
        function getUser(name) {
            if (!name) {
                throw new Error('用户名不能为空');
            }
            return { name };
        }

        // throw表达式提案的写法
        /*
        const getUser = name => 
            !name ? throw new Error('用户名不能为空') : { name };
        */

        // 实际应用示例
        // 1. 条件表达式中使用
        /*
        const env = process.env.NODE_ENV === 'production' 
            ? 'production'
            : throw new Error('必须在生产环境运行');
        */

        // 2. 箭头函数中使用
        /*
        const required = () => throw new Error('参数是必需的');
        const add = (left = required(), right = required()) => left + right;
        */

        // 3. 模拟throw表达式
        function throwIf(condition, error) {
            if (condition) {
                throw error;
            }
            return condition;
        }

        // 使用示例
        function validateUser(user) {
            try {
                throwIf(!user, new Error('用户对象不能为空'));
                throwIf(!user.name, new Error('用户名不能为空'));
                throwIf(user.age < 0, new Error('年龄不能为负数'));
                return true;
            } catch (e) {
                console.error('验证失败:', e.message);
                return false;
            }
        }

        // 4. 链式调用中的错误处理
        class Result {
            constructor(value) {
                this.value = value;
            }

            map(fn) {
                try {
                    return new Result(fn(this.value));
                } catch (e) {
                    return new Result(null);
                }
            }

            getOrThrow(error) {
                if (this.value === null) {
                    throw error;
                }
                return this.value;
            }
        }

        const result = new Result(5)
            .map(x => x * 2)
            .map(x => {
                if (x > 10) throw new Error('值太大');
                return x;
            })
            .getOrThrow(new Error('处理失败'));
    </script>
</body>
</html> 